/* @flow */

import {
	parse
} from './parser/index'
import {
	optimize
} from './optimizer'
import {
	generate
} from './codegen/index'
import {
	createCompilerCreator
} from './create-compiler'



 //createCompiler是createCompilerCreator的返回值方法，
 //createCompiler该方法执行后返回一个对象{ comiled,  compileToFunctions } 
 //compileToFunctions是由./to-function.js/createCompileToFunctionFn的方法生成，
 //参数就是AST语法对象和render表达式字符串
export const createCompiler = createCompilerCreator(function baseCompile(
	template: string,
	options: CompilerOptions
): CompiledResult {
	// options = {
	// 	expectHTML: true,
	// 	modules, 
	// 	directives, 
	// 	isPreTag, 
	// 	isUnaryTag,
	// 	mustUseProp, 
	// 	canBeLeftOpenTag,
	// 	isReservedTag,
	// 	getTagNamespace,
	// 	staticKeys,
	// 	outputSourceRange: process.env.NODE_ENV !== 'production',
	// 	shouldDecodeNewlines,
	// 	shouldDecodeNewlinesForHref,
	// 	delimiters: options.delimiters,
	// 	comments: options.comments
	// }
	// 使用 parse 函数将模板解析为 AST
	const ast = parse(template.trim(), options)
	if (options.optimize !== false) {
		optimize(ast, options)
	}
	const code = generate(ast, options)
	return {
		ast, //AST语法，一个对象
		render: code.render,//这里得到的是render的字符串: "with(this){....}"
		staticRenderFns: code.staticRenderFns
	}
})
